package com.gf.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// 配置注解  ,标记该类是个配文类
@Configuration
@ConditionalOnWebApplication
// 当这个类（HelloService）在classPath下，并且容器中没有相同的，就自动配置
@ConditionalOnClass(HelloService.class)
// 开启指定类的配置，既是接受配置文件中的参数的类， 多个时我们可以这么写value={Properties1.class,Properteis2.class....}
@EnableConfigurationProperties(HelloProperties.class)
// 表示只有我们的配置文件是否配置了以car为前缀的资源项值，并且在该资源项值为enabled，如果没有配置我们默认设置为enabled
@ConditionalOnProperty(prefix="gf.hello", value="enabled", matchIfMissing=true)
public class HelloServiceAutoConfiguration {

    @Autowired
    HelloProperties helloProperties;

    /**
     * @ConditionalOnBean:当容器中有指定的Bean的条件下
     * @ConditionalOnClass：当类路径下有指定的类的条件下
     * @ConditionalOnExpression:基于SpEL表达式作为判断条件
     * @ConditionalOnJava:基于JVM版本作为判断条件
     * @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
     * @ConditionalOnMissingBean:当容器中没有指定Bean的情况下
     * @ConditionalOnMissingClass:当类路径下没有指定的类的条件下
     * @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
     * @ConditionalOnProperty:指定的属性是否有指定的值
     * @ConditionalOnResource:类路径下是否有指定的资源
     * @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个，或者在有多个Bean的情况下，用来指定首选的Bean
     * @ConditionalOnWebApplication:当前项目是Web项目的条件下
     *
     * 摘抄地址：https://blog.csdn.net/liuchuanhong1/article/details/55057135
     * @return
     */
    @Bean
    @ConditionalOnMissingBean
//    @ConditionalOnMissingBean(HelloService.class)// 当容器中没有指定Bean的情况下，自动配置carService类
    /*@ConditionalOnMissingBean({MapperFactoryBean.class})*/
    public HelloService helloService() {
        HelloService service = new HelloService();
        service.setHelloProperties( helloProperties  );
        return service;
    }


}
